package stack

import (
	"errors"
	"fmt"
)

type Node struct {
	data interface{}
	Next *Node
}
// 链表栈
type LinkedStack struct {
	top    *Node // 栈顶
	length int   // 长度
}

func NewLinkedStack() *LinkedStack {
	return &LinkedStack{top: nil, length: 0}
}

func (s *LinkedStack) IsEmpty() bool {
	return s.top == nil
}

func (s *LinkedStack) Length() int {
	return s.length
}

func (s *LinkedStack) Push(data interface{}) {
	node := new(Node)
	node.data = data
	node.Next = s.top
	s.top = node
	s.length++
}

func (s *LinkedStack) Pop() (interface{}, error) {
	if s.IsEmpty() {
		return nil, errors.New("empty stack")
	}
	node := s.top
	data := node.data
	s.top = node.Next
	s.length--
	return data, nil
}

// 遍历（不删除任何节点，只读取值）
func (s *LinkedStack) Print() {
	if s.IsEmpty() {
		fmt.Println("Empty Stack")
	} else {
		head := s.top
		for head != nil {
			fmt.Println(fmt.Sprintf("%d ->", head.data))
			head = head.Next
		}
	}

	fmt.Println()
}
